const { DataTypes } = require("sequelize");
const { sequelize } = require("../sequelize");
const Article = require("./article");

/* 
1. 表名推断
    默认情况下,当未提供表名时,Sequelize 会自动将模型名复数并将其用作表名.
*/
const User = sequelize.define(
  "User",
  {
    // 在这里定义模型属性

    id: {
      //主键
      type: DataTypes.INTEGER,
      autoIncrement: true,
      primaryKey: true,
    },
    nickname: {
      //昵称
      type: DataTypes.STRING(36),
    },
    username: {
      //用户名
      type: DataTypes.STRING(36),
      allowNull: false, //不允许为null
      //   unique: true, //唯一约束
      validate: {
        // is: /^[0-9a-f]{64}$/i,
        len: [1, 36],
      },
    },
    pwd: {
      //密码
      type: DataTypes.STRING(24),
      //   allowNull:false,
      validate: {
        // is: /^[0-9a-f]{64}$/i,
        len: [8, 24],
        notEmpty: true,
      },
    },
    signature: {
      //签名
      type: DataTypes.STRING,
      defaultValue: "^_^ 这个人很懒,什么都没留下...",
    },
    avatar: {
      //头像
      type: DataTypes.STRING,
      defaultValue: "sj.png",
    },
  },
  {
    indexes: [{ unique: true, fields: ["username"] }],
    // 这是其他模型参数
    // freezeTableName: true,//强制表名等于模型名,全局已配置
  }
);

// User.sync({ alter: false,force:true }).then(() => {
//   console.log("用户模型表刚刚(重新)创建！");
// });
// `sequelize.define` 会返回模型
(async () => {
  await sequelize.sync({ alter: true });
  console.log("数据模型同步成功");
})();

// User.create({username:'s玖',id:16})
User.hasMany(Article, {
  foreignKey: "uid",
  targetKey: "id",
  //   关联关系,但不创建外键
  constraints: false,
});
Article.belongsTo(User, {
  foreignKey: "uid",
  targetKey: "id",
  //   关联关系,但不创建外键
  constraints: false,
  //   as:'userInfo'
});
// User.hasMany(sequelize.models.article);
console.log(User === sequelize.models.User); // true

module.exports = User;
